package com.workcell.workdata.xthings.utils;

import cn.hutool.core.util.ObjectUtil;
import com.workcell.workdata.xthings.constant.ExtOutputAttributes;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author 廖博文
 * @Date 2022/12/1 15:44
 * @Description
 */
public class ObjectUtils {


	/**
	 * object转集合
	 * @param obj
	 * @param clazz
	 * @return
	 * @param <T>
	 */
	public static <T> List<T> castList(Object obj, Class<T> clazz) {
		List<T> result = new ArrayList<>();
		if (obj instanceof List<?>) {
			for (Object o : (List<?>) obj) {
				result.add(clazz.cast(o));
			}
			return result;
		}
		return null;
	}

	/**
	 * 将一个类查询方式加入List-map
	 * 注：需要转换的必须是对象，即有属性
	 */
	public static List<Map<String, Object>> setConditionToListMap(Object obj){
		List<Map<String, Object>> resultList = new ArrayList<>();
		if(obj == null){
			return null;
		}
		// 获取类的各个属性值
		Field[] fields = obj.getClass().getDeclaredFields();
		for(Field field : fields){
			// 获取属性的自定义参数
			ExtOutputAttributes checkBean = field.getAnnotation(ExtOutputAttributes.class);
			if (ObjectUtil.isEmpty(checkBean) || ObjectUtil.isEmpty(getValueByFieldName(field.getName(),obj))){
				continue;
			}
			// 获取类的属性名称
			Map<String, Object> map = new LinkedHashMap<>();
			map.put("name",field.getName());
			map.put("key",checkBean.key());
			map.put("value",getValueByFieldName(field.getName(),obj));
			resultList.add(map);
		}
		return resultList;
	}
	/**
	 * 根据属性名获取该类此属性的值
	 * @param fieldName
	 * @param object
	 * @return
	 */
	public static Object getValueByFieldName(String fieldName,Object object){
		String firstLetter=fieldName.substring(0,1).toUpperCase();
		String getter = "get"+firstLetter+fieldName.substring(1);
		try {
			Method method = object.getClass().getMethod(getter, new Class[]{});
			Object value = method.invoke(object, new Object[] {});
			return value;
		} catch (Exception e) {
			return null;
		}
	}

}
